'''
给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
有效字符串需满足：
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1：
输入：s = "()"
输出：true
示例 2：
输入：s = "()[]{}"
输出：true
示例 3：
输入：s = "(]"
输出：false
提示：
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
'''
#使用堆栈来实现
class Solution():
    def isValid(self, s):
        stack = []  #定义一个栈用来存放左括号
        left_bracket = ['(','[','{']
        right_bracket = [')',']','}']
        bracket_map = {')':'(',']':'[','}':'{'} #定义一个左右括号匹配的字典/映射
        for char in s: #遍历字符串
            if char in left_bracket:   #左括号则压栈
                stack.append(char)
            elif char in right_bracket: #右括号弹栈
                if not stack:   #栈空不匹配
                    return False
                top_char = stack.pop()
                if bracket_map[char] != top_char:   #不匹配
                    return False
        if stack:   #匹配完栈非空
            return False
        return True
#示例
if __name__ == '__main__':
    s1 = '()[]{}'
    s2 = '({[]})'
    s3 = '()[}]'
    s = Solution()
    print(s.isValid(s1))
    print(s.isValid(s2))
    print(s.isValid(s3))